package com.demo.data.struct2.排序.快速排序2;

import com.demo.data.struct2.排序.Util;

// 双边循环快排
// 1、选择最左元素作为基准点元素
// 2、j指针负责从右向左找比基准点小的元素；i指针负责从左向右找比基准点大的元素，一旦找到二者交换，直至i, j相交
// 3、最后基准点与i（此时i与j相等）交换，i即为分区位置
public class QuickSort2 {
	
	public static void main(String[] args) {
		int[] a = {5, 3, 7, 2, 9, 8, 1, 4};
		quick(a, 0, a.length - 1);
		Util.display(a);
	}

	public static void quick(int[] a, int l, int h) {
		if(l >= h) {
			return;
		}
		int p = sort(a, l, h); // p: 索引值
		quick(a, l, p-1); // 左边分区的范围确定
		quick(a, p+1, h); // 右边分区的范围确定
	}
	
	private static int sort(int[] a, int l, int h) {
		int pv = a[l]; // 基准点
		int i = l;
		int j = h;
		while(i < j) {
			// j从右找小的
			while(i<j && a[j] > pv) {
				j--;
			}
			// i从左找大的
			while(i<j && a[i] <= pv) {
				i++;
			}
			Util.swap(a, i, j);
		}
		Util.swap(a, l, j);
		return j;
	}
	
}
